package com.enjoy.xbase.qk.impi;

import android.util.Log;

import com.alibaba.fastjson.JSON;
import com.enjoy.xbase.qk.bean.ERR;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 返回类
 * @param <T>
 */
public abstract class RequestBack<T> {
    private T data;

    private Type getClassType(Class<?> clazz) {
        Type genericSuperclass = clazz.getGenericSuperclass(); // 当前对象的直接超类的
        if (genericSuperclass instanceof ParameterizedType) {
            // 参数化类型
            ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
            // 返回表示此类型实际类型参数的 Type 对象的数组
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            return actualTypeArguments[0];
        } else {
            return genericSuperclass;
        }
    }

    /**
     * 描述：请求开始
     */
    public abstract void onStart();

    /**
     * 描述：请求处理成功
     */
    public abstract void onSuccess(T data);//

    /**
     * 描述：请求错误、数据结构不匹配、
     */
    public abstract void onFailed(ERR err);

    /**
     * 描述：请求取消
     *
     */
    public void onCancel() {

    }

    public final void onSuccess() {
        onSuccess(data);
    }

    public final void setRequestResult(String content) {
        changeTo(content);
    }

    private void changeTo(String content) {
        Log.e("请求结果", "--" + content);
        Type clazz = getClassType(getClass());
        if (clazz == String.class) {
            data = (T) content;
        } else if (clazz.getClass().getName().contains("String")) {
            data = (T) content;
        } else {
            try {
                data = JSON.parseObject(content, clazz);
                if (data == null) {
                    throw new RuntimeException("json解析异常");
                }
            } catch (Exception e) {
                Log.e("", "json解析出错");
                e.printStackTrace();
                throw new RuntimeException("json解析异常");
            }
        }
    }

    public T getData() {
        return data;
    }
}
